package fr.istic.linkedcv.client.presentation.views.impl;

import java.util.List;
import java.util.Map;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

import fr.istic.linkedcv.client.GroupesCli;
import fr.istic.linkedcv.client.PersonneCli;
import fr.istic.linkedcv.client.presentation.Ui;
import fr.istic.linkedcv.client.presentation.clickhandlers.JoinGroupeClickHandler;
import fr.istic.linkedcv.client.presentation.clickhandlers.ExitGroupeClickHandler;
import fr.istic.linkedcv.client.presentation.views.View;
import fr.istic.linkedcv.client.services.GroupeService;
import fr.istic.linkedcv.client.services.GroupeServiceAsync;
import fr.istic.linkedcv.client.services.PersonneService;
import fr.istic.linkedcv.client.services.PersonneServiceAsync;

public class ListeGroupes extends View  {

	private final PersonneServiceAsync personneServiceAsync = GWT.create(PersonneService.class);
	private final GroupeServiceAsync groupeServiceAsync = GWT.create(GroupeService.class);
	protected HTML html = new HTML();
	protected VerticalPanel panel;
	public ListeGroupes(Ui ui){
		super(ui);
		
	}
	@Override
	public void build() {
		panel = new VerticalPanel();
		panel.addStyleName("lists");
		panel.setWidth("300px");
		final String filter = properties.get("filter");
		if(filter.equals("my")){
			personneServiceAsync.getListeGroupes(new AsyncCallback<List<GroupesCli>>() {
				
				@Override
				public void onSuccess(List<GroupesCli> groupes) {				
					createLinks(groupes,filter);
				}
				
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("Failure : "+caught);
				}
			});
		}else{
			groupeServiceAsync.getListeGroupes(new AsyncCallback<List<GroupesCli>>() {

				@Override
				public void onFailure(Throwable caught) {
					Window.alert("Failure : "+caught);
					
				}

				@Override
				public void onSuccess(List<GroupesCli> groupes) {
					createLinks(groupes,filter);
					
				}
			});
		}
		
	}

	protected void createLinks(List<GroupesCli> groupes, String filter) {
		if(groupes.size()>0){
			for (GroupesCli groupe : groupes) {
				String groupeName = groupe.getName();
				String idGroupe = groupeName.replace(" ", "_");
				Hyperlink lien = new Hyperlink(groupeName, "groupe-"+idGroupe);
				HorizontalPanel hPanel = new HorizontalPanel();
				Button deleteGroupeBtn = new Button("Supprimer");
				deleteGroupeBtn.addClickHandler(deleteGroupeClickHandler(groupeName));
				
				hPanel.setSpacing(10);
				hPanel.add(lien);			
				hPanel.add(deleteGroupeBtn);
				hPanel.addStyleName("element-list");
				if(filter.equals("my")){
					Button exitGroupe = new Button("Quitter le groupe");
					exitGroupe.addClickHandler(new ExitGroupeClickHandler(groupeName,ui));
					
					hPanel.add(exitGroupe);
				}else{
					if(!hasGroupe(groupe)){
						Button joinGroupeBtn = new Button("Rejoindre");
						joinGroupeBtn.addClickHandler(new JoinGroupeClickHandler(groupeName,ui));
						hPanel.add(joinGroupeBtn);
					}
				}
			    panel.add(hPanel);
			    
			}
		}else{
			panel.add(new HTML("Aucun groupe"));
		}

	}
	
	private boolean hasGroupe(GroupesCli groupe) {
		boolean res = false;
		PersonneCli currentPersonne = ui.getControle().getPersonneCli();
		for(String nomGroupe : currentPersonne.getListeGroupes()){
			if(nomGroupe.equals(groupe.getName())){
				res = true;
			}
		}
		return res;
	}
	private ClickHandler deleteGroupeClickHandler(final String groupeName) {
		ClickHandler deleteGroupe = new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				groupeServiceAsync.deleteGroupe(groupeName, new AsyncCallback<Boolean>() {

					@Override
					public void onFailure(Throwable caught) {
						
						
					}

					@Override
					public void onSuccess(Boolean result) {
						if(result){
							ui.fireCurrentHistoryState();
						}else{
							Window.alert("Echec de la suppression");
						}
					}					
				});
			}
		};
		return deleteGroupe;
	}
	@Override
	public Widget getWidget() {
		return panel;
	}

	@Override
	public void addProperties(Map<String, String> properties) {
		super.addProperties(properties);
		
	}

	@Override
	public void addProperty(String key, String value) {
		super.addProperty(key, value);
	}

}
